/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import entidad.Medicion;
import entidad.Persistencia;
import frontera.Observer;
import frontera.ObserverFactory;
import frontera.Subject;
import java.util.*;

/**
 *
 * @author Zergio
 */
public class FlujoMedicion implements Subject {

    private static FlujoMedicion m_instance;
    private Persistencia sistema = Persistencia.getInstance();
    private Collection<Observer> observadores;

    private FlujoMedicion() {
        observadores = new ArrayList<Observer>();
        this.attach(ObserverFactory.getInstance().getObserver(1));
        this.attach(ObserverFactory.getInstance().getObserver(2));
        this.attach(ObserverFactory.getInstance().getObserver(3));
        this.attach(ObserverFactory.getInstance().getObserver(4));
        this.attach(ObserverFactory.getInstance().getObserver(5));
    }

    public void anadirMedicion(Date fecha, double temperatura, double pluviosidad, double presionAtmosferica) {

        Medicion temporal = new Medicion(fecha, temperatura, presionAtmosferica, pluviosidad);

        ArrayList<Medicion> nuevoSistema = sistema.getHistorico();
        nuevoSistema.add(temporal);

        Collections.sort(nuevoSistema,
                new Comparator() {

                    @Override
                    public int compare(Object o1, Object o2) {
                        Medicion p1 = (Medicion) o1;
                        Medicion p2 = (Medicion) o2;
                        return p1.getFecha().compareTo(p2.getFecha());
                    }
                });

        sistema.setHistorico(nuevoSistema);
        notifyObserver();
    }

    public Medicion ultimaMedicion() {

        int n = sistema.getHistorico().size();

        if (n > 0) {
            return sistema.getHistorico().get(n - 1);
        } else {
            return null;
        }
    }

    @Override
    public void attach(Observer Ob) {
        observadores.add(Ob);
    }

    @Override
    public void notifyObserver() {
        for (Observer observer : observadores) {
            observer.update();
        }
    }

    @Override
    public void remove(Observer Ob) {
        observadores.remove(Ob);
    }

    public synchronized static FlujoMedicion getInstance() {
        if (m_instance == null) {
            m_instance = new FlujoMedicion();
        }

        return m_instance;
    }
}
